public class Filter {
    /*
     * 0洛天依     1言和     2乐正绫    3乐正龙牙   4徵羽摩柯   5墨清弦
     * 6星尘       7海伊     8苍穹      9赤羽      10诗岸     11星尘minus
     * 12牧心     13艾可
     * 14心华     15悦成    16章楚楚
     * 17初音未来
     */
    public static final String[] VOCALS = {"洛天依", "言和", "乐正绫", "乐正龙牙", "徵羽摩柯", "墨清弦", "星尘", "海伊", "苍穹", "赤羽", "诗岸", "Minus", "牧心", "艾可", "心华", "悦成", "章楚楚", "初音未来"};
    private static final char[] KATAGANAS = "あいうえおかきくけこさしすせそたちつてとなにぬねのらりるれろまみむめもはひふへほぱぴぷぺぽばびぶべぼざじずぜぞやるよん".toCharArray();
    private static final char[] HIRAGANAS = "アイウエオカキクケコサシスセソタチツテトナニヌネノラリルレロマミムメモハヒフヘホパピプペポバビブベボザジズゼゾヤルヨン".toCharArray();

    /**
     * 检查一首歌曲的状况
     *
     * @param title 歌曲标题
     * @param tags  歌曲标签
     * @param desc  歌曲简介
     * @return 返回FilterResult，包括歌姬信息、引擎信息
     */
    public static FilterResult check(String title, String tags, String desc) {
        FilterResult filterResult = new FilterResult();
        if (isJapanese(title)) {
            return filterResult;
        }
        title = title.replace("翻调", "COVER").replace("翻唱", "COVER");
        if (title.toUpperCase().contains("COVER")) {
            if (!searchVocals(title.substring(0, title.toUpperCase().indexOf("COVER") + 1), filterResult)) {
                searchVocals(tags + desc, filterResult);
            }
        } else {
            if (!searchVocals(title, filterResult)) {
                searchVocals(tags + desc, filterResult);
            }
        }
        filterResult.calc(); // 分类为V/SV、Vsinger/Medium5
        return filterResult;
    }

    /**
     * 在字符串中查找歌姬的名字
     *
     * @param string       字符串
     * @param filterResult 找到的结果
     * @return 是否找到歌姬的名字
     */
    public static boolean searchVocals(String string, FilterResult filterResult) {
        // 预处理字符串中的子文本
        String pretreatedString = string.replace("星尘M", "M")
                .replace("星尘m", "M")
                .replace("minus", "Minus")
                .replace("MINUS", "Minus")
                .replace("初音ミク", "初音未来");

        // 默认认为找不到，找到歌姬名字才为true
        boolean flag = false;

        // 如果包括某个歌姬的名字，则filterResult.vocal对应为true
        for (int i = 0; i < VOCALS.length; i++) {
            if (pretreatedString.contains(VOCALS[i])) {
                filterResult.vocals[i] = true;
                flag = true;
            }
        }
        return flag;
    }


    /**
     * 判断一个字符串是否是日语
     *
     * @param string 字符串
     * @return 是否是日语
     */
    public static boolean isJapanese(String string) {
        if (string.contains("日本語") || string.contains("日语") || string.contains("中文字幕") || string.contains("推荐歌曲")
                || string.contains("转载") || string.contains("搬运") || string.contains("日刊T") || string.contains("环绕声")) {
            return true;
        }
        for (char c : KATAGANAS) {
            if (string.contains("" + c)) {
                return true;
            }
        }
        for (char c : HIRAGANAS) {
            if (string.contains("" + c)) {
                return true;
            }
        }
        return false;
    }
}
